3.6.1.6 m-LM0(ベースアドレスレジスタ書き込みを除く)
ベースアドレスレジスタ(BAR)への書き込みの場合を除き、LM0オペランドの文法は次の通りである。
code:txt
$(l|ll)m(<addr>[v<adri>]j<madpe>|t<addr>[v<adri>]) # Auto stride mode
|$(l|ll)m(<flat_addrs>j<madpe>|t<flat_addrs>) #Flat mode
1 番目の文法がAuto strideモード、 2 番目の文法がFlatモードである(両モードについては1.2 機械語命令概観を参照)。
LM0のベースアドレスレジスタへの書き込みについては3.6.1.7 m-LM0(ベースアドレスレジスタ書き込み)で述べる。
また、ここでは入力の符号反転(3.6.9.22 入力符号反転)、精度拡張(3.6.9.23 入力の精度拡張)、丸め(3.6.9.24 入力の精度縮減)、出力のマスク適用(3.6.2.1 書き込みマスク適用)については省略する。
括弧で付したそれぞれの節を参照のこと。
[(l|ll)]はアクセス語長指定である。
空であれば単語、lであれば長語、llであれば 2 長語となる。
後半は通常アドレッシング(Auto strideモード[v[]][j]またはFlatモード[j])とTレジスタ間接参照(t[v[]]またはt<flat_[add]rs>)の 2 パターンに分かれる。
まず<addr>などの各パートについて述べる。
Auto strideモードでは、によりLM0内の単語単位のアドレスオフセットを指定する。
1 命令 4 サイクルの間この値が最終的なアドレス値に加算される。
vはサイクル間のアドレスインクリメントを指定する。
vを付けなかった場合、インクリメント幅は 0 となる。
<adri>は単語単位のインクリメント幅で、値を省略するとアクセス語長での 1 語分、すなわち連続領域を重複なくアクセスするように設定される。
Flatモードでは、<flat_addrs>にて[,,,]の形式で各サイクルの単語単位アドレスを直接指定する。
ここで角括弧([])は実際にこの記号を記述することを意味し、オプションの意味ではない。
jはMAB内アドレス修飾を有効にする。
これは、<madpe>で指定した番号以下のPEでのみ、アドレスをアクセス語長での 1 語分インクリメントする。
tはTレジスタ間接参照を有効にする。
各サイクルでTレジスタから読み出した単語単位の値が最終的なアドレス値に加算される。
さらに、アドレスは常に暗黙にベースアドレスレジスタから読み出した単語単位のアドレス値が加算される。
以上をまとめると、Auto strideモードでの単語単位アドレスは以下で決定される。
code:txt
BAR + (TC if TI else 0) + ADDR + ADRI×C×WL + (WL if MAADJ and PE≤MADPE else 0)
ここで、
BAR:ベースアドレスレジスタから読み出した値
C: 0から 3 のサイクル番号
T[C]: Tレジスタからそのサイクルで読み出した値
TI: Tレジスタ間接参照が有効のとき真
ADDR:<addr>の値
ADRI:<adri>の値
WL:単語アクセス、長語アクセス、 2長語アクセスそれぞれで1, 2, 4
MAADJ: MAB内アドレス修飾が有効のとき真
MADPE:madpeの値
PE: 0から 3 のPE番号
である。
FlatモードではADDR + ADRI×Cの部分を各サイクルで直接指定すると読み替えればよい。
アドレスは各サイクルでアクセス語長にアラインしていないとならない。
よって、Auto strideモードではaddrとadriはいずれも、長語アクセスなら 2 の倍数、 2 長語アクセスなら 4 の倍数になっていないとならない。
これらはアセンブラによりチェックされるが、ベースアドレスレジスタの値のみは実行時に決まるのでアラインしていない可能性がある。
その場合は端数は切り捨てられる。
code:例
lpassa $lm0,4,10,14$ln0v
LM0からLM1に計 4 長語をコピーする。
LM0にFlatモードを用いているので、これはFlatモードでしかアセンブルできない。
その際、LM1のアドレスもFlatモードの等価な指定に置き換えられる。
つまり、これは次に等しい。
code:txt
lpassa $lm0,4,10,14$ln0,2,4,6